#ifndef NETBUS_H_
#define NETBUS_H_

#include <string>
#include <vector>

class ConnectPool;
class Provider;
class Deliver;

/**
 * @class NetBus
 * @details NetBus类用于管理RabbitMQ连接和消息传递，包括连接池、Provider和Deliver等组件。
 * @note NetBus类是单例模式，不允许外部实例化，只能通过GetInstance()获取唯一实例。
 */
class NetBus
{
public:
    /**
     * @brief 获取NetBus的唯一实例
     * @return NetBus实例指针
     */
    static NetBus *GetInstance();

    /**
     * @brief 设置RabbitMQ连接的主机信息
     * @param host 主机信息，默认为"localhost"
     */
    void setHost(const std::string &host = "localhost");

    /**
     * @brief 设置RabbitMQ连接的端口号
     * @param port 端口号，默认为5672
     */
    void setPort(uint port = 5672);

    /**
     * @brief 设置RabbitMQ连接的用户名
     * @param username 用户名，默认为"guest"
     */
    void setUsername(const std::string &username = "guest");

    /**
     * @brief 设置RabbitMQ连接的密码
     * @param password 密码，默认为"guest"
     */
    void setPassword(const std::string &password = "guest");

    /**
     * @brief 设置NetBus使用的线程数量
     * @param thread_num 线程数量，默认为4
     */
    void setThreadNum(int thread_num = 4);

    /**
     * @brief 启动NetBus，初始化并开始工作
     */
    void start();

    /**
     * @brief 添加一个Provider，每个Provider对应一个RabbitMQ的Queue
     * @param provider Provider对象指针，由调用者管理资源
     * @return 是否添加成功
     */
    bool addProvider(Provider *provider);

    /**
     * @brief 发送消息，会阻塞等待直到发送成功或超时，超时时返回false
     * @param deliver Deliver对象指针，由调用者管理资源
     * @return 是否发送成功
     */
    bool send(Deliver *deliver);

    /**
     * @brief 发送消息并等待接收回复，会阻塞等待直到发送成功或超时，超时时返回false
     * @param deliver Deliver对象指针，由调用者管理资源
     * @return 是否发送成功并接收到回复
     */
    bool sendAndReceived(Deliver *deliver);

private:
    /**
     * @brief 构造函数，私有化以防止外部实例化
     */
    NetBus();

    /**
     * @brief 析构函数，私有化以确保正确的资源释放
     */
    ~NetBus();

private:
    std::string host_;     // RabbitMQ主机信息
    uint port_;            // RabbitMQ端口号
    std::string username_; // RabbitMQ用户名
    std::string password_; // RabbitMQ密码
    int thread_num_;       // NetBus使用的线程数量

    ConnectPool *connect_pool_;         // 连接池指针，用于管理RabbitMQ连接
    std::vector<Provider *> providers_; // Provider列表，每个Provider对应一个RabbitMQ的Queue
};

#endif // NETBUS_H_